package cn.yanceysong.gitstats.model;

import lombok.Data;
import lombok.Builder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.HashMap;

/**
 * 贡献者统计信息
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ContributorStats {
    
    /**
     * 贡献者姓名
     */
    private String name;
    
    /**
     * 贡献者邮箱
     */
    private String email;
    
    /**
     * 提交次数
     */
    private int commitCount;
    
    /**
     * 总代码行数（新增+修改）
     */
    private int totalLines;
    
    /**
     * 新增行数
     */
    private int addedLines;
    
    /**
     * 删除行数
     */
    private int deletedLines;
    
    /**
     * 修改行数（实际修改，不包括新增和删除）
     */
    private int modifiedLines;
    
    /**
     * 首次提交时间
     */
    private LocalDateTime firstCommitTime;
    
    /**
     * 最后提交时间
     */
    private LocalDateTime lastCommitTime;
    
    /**
     * 按日期统计的详细信息
     */
    private Map<String, DailyStats> dailyStats;
    
    /**
     * 按文件类型统计
     */
    private Map<String, FileTypeStats> fileTypeStats;
    
    /**
     * 添加统计信息
     */
    public void addStats(int added, int deleted, int modified) {
        this.addedLines += added;
        this.deletedLines += deleted;
        this.modifiedLines += modified;
        this.totalLines = this.addedLines + this.modifiedLines;
    }
    
    /**
     * 增加提交次数
     */
    public void incrementCommitCount() {
        this.commitCount++;
    }
    
    /**
     * 更新提交时间范围
     */
    public void updateCommitTime(LocalDateTime commitTime) {
        if (this.firstCommitTime == null || commitTime.isBefore(this.firstCommitTime)) {
            this.firstCommitTime = commitTime;
        }
        if (this.lastCommitTime == null || commitTime.isAfter(this.lastCommitTime)) {
            this.lastCommitTime = commitTime;
        }
    }
    
    /**
     * 获取每日统计，如果不存在则创建
     */
    public DailyStats getOrCreateDailyStats(String date) {
        if (dailyStats == null) {
            dailyStats = new HashMap<>();
        }
        return dailyStats.computeIfAbsent(date, k -> DailyStats.builder().build());
    }
    
    /**
     * 获取文件类型统计，如果不存在则创建
     */
    public FileTypeStats getOrCreateFileTypeStats(String fileType) {
        if (fileTypeStats == null) {
            fileTypeStats = new HashMap<>();
        }
        return fileTypeStats.computeIfAbsent(fileType, k -> FileTypeStats.builder().fileType(fileType).build());
    }
}
